Traditionally, tests have been written and designed in a fairly hand-crafted manor. While some advantages have existed as a result, the scenarios themselves have remained somewhat fixed, i.e., although the data or input might vary (slightly), for the most part, the sequences of operations that are actually made on the product code, does not vary much.
A list of disadvantages for traditional ‘hand-crafted’ approach includes (1) Hand-crafted tests require a lot of code (to cover every scenario), (2) Hand-crafted tests are expensive to maintain (cleanup can last for years), (3) Hand-crafted test issues surpass product bugs found (e.g., as shown in verification data), (4) Hand-crafted tests have low coverage (generally only about 60%), (5) Hand-crafted tests are rigid (difficult to improve, change, or keep up with specification/developer changes), (6) Hand-crafted tests are static (running the same scenarios over and over, meanwhile missing bugs), (7) Hand-crafted tests include poor designs (everyone designs tests differently) and (8) Hand-crafted tests do not scale well (with increasing feature sets, complexity, and deliverables).
These disadvantages can be overwhelming in terms of the intense resources required for cleanup, maintenance, and improvements of tests. The ability for tests to find issues before customers do is also diminishing as systems become more complex, have more dependencies, and are used in unforeseeable scenarios. Accordingly, there is a need for a model-based test framework that addresses these and other deficiencies in the current state of software testing techniques.